/**
 * @file CPvmSlaveCommands.hpp Deklarácia triedy CPvmSlaveCommands.
 *
 * @author Martin Kosorinský.
 * @date 10.10.2009.
 */

#ifndef CPVMSLAVECOMMANDS_HEADER
#define CPVMSLAVECOMMANDS_HEADER

#include "CPvmCommands.hpp"

/**
 * @brief Trieda zapúzdrujúca komunikačné PVM príkazy pre klienta.
 */
class CPvmSlaveCommands : public CPvmCommands {
public:
    /**
     * @brief Procedúra zabezpečujúca odoslanie @a distinguished pointu.
     * Správa je odoslaná prostredníctom PVM adresátovi danému vstupným parametrom. Správa je označená
     * príznakom PVM_ECDLP_DISTPOINT, ktorý umožní jej spracovanie adresátom. Vstupné parametre procedúru
     * sú pred odoslaním spracované procedúrou CPvmCommands::pvmPackBig().
     * @note Procedúra nepodporuje odosielanie bodu v nekonečne (infinum).
     * @param[in] tid Identifikátor adresáta správy.
     * @param[in] P Odosielaný @a distinguished bod (nesmie byť infinum).
     * @param[in] a Prvý exponent prislúchajúci k bodu @a P (viz. Brentov algoritmus).
     * @param[in] b Prvý exponent prislúchajúci k bodu @a P (viz. Brentov algoritmus).
     */
    static void pvmSendDistPoint(int tid, epoint * P, big a, big b);
    /**
     * @brief Procedúra zabezpečujúca odoslanie vypočítaného diskrétneho logaritmu.
     * Správa je odoslaná prostredníctom PVM adresátovi danému vstupným parametrom. Správa je označená
     * príznakom PVM_ECDLP_DL, ktorý umožní jej spracovanie adresátom. Vstupné parametre procedúru
     * sú pred odoslaním spracované procedúrou #pvmPackBig. Správa primárne slúži na notifikáciu servera o
     * úspešnom nájdení diskrétneho logaritmu, čo v normálnom prípade znamená koniec výpočtov.
     * @param[in] tid Identifikátor adresáta správy.
     * @param[in] d Vypočítaný diskrétny logaritmus typy @c big.
     */
    static void pvmSendDL(int tid, big d);
    /**
     * @brief Procedúra extrahujúca premennú typu @c *epoint z PVM message bufferu.
     * Procedúra zabezpečí extrahovanie bodu eliptickej krivky po prijatí správy typu PVM_ECDLP_TASKPOINT,
     * ktorá obsahuje bod, ktorého diskrétny logaritmus budú jednotlivé výpočtové uzly hľadať.
     * @param[out] P je vopred alokovaná štruktúra typu *epoint, do ktorej bude uložený spracovaný bod.
     */
    static void pvmUnpackTaskPoint(epoint * P);
    /**
     * @brief Procedúra extrahujúca parametre eliptickej krivky z PVM message bufferu.
     * Procedúra zabezpečí extrahovanie parametrov eliptické krivky a súradníc jej generátora po prijatí
     * správy typu PVM_ECDLP_ECPARAMS. Správa obsahuje 6 serializovaných štruktúr typu @c big.
     * @param[out] a Vopred alokovaná štruktúra typu @c big, do ktorej bude uložený prvý koeficient krivky.
     * @param[out] b Vopred alokovaná štruktúra typu @c big, do ktorej bude uložený prvý koeficient krivky.
     * @param[out] p Vopred alokovaná štruktúra typu @c big, do ktorej bude uložený modul krivky.
     * @param[out] o Vopred alokovaná štruktúra typu @c big, do ktorej bude uložený rád krivky.
     * @param[out] x Vopred alokovaná štruktúra typu @c big, do ktorej bude uložená prvá súradnica generátora.
     * @param[out] y Vopred alokovaná štruktúra typu @c big, do ktorej bude uložený druhá súradnica generátora.
     */
    static void pvmUnpackECParams(big a, big b, big p, big o, big x, big y);
};
#endif /* CPVMSLAVECOMMANDS_HEADER */
